// 导入 express 模块
const express = require("express");
// 导入 cors 中间件
const cors = require("cors");
const Joi = require("joi");
const { expressjwt } = require("express-jwt");
const userRouter = require("./router/user");
const { jwtKey } = require("./config");

// 创建 express 的服务器实例
const app = express();

// 全局路由错误处理中间件
app.use(function (req, res, next) {
  // 在res对象挂载cc函数来处理错误
  res.cc = function (err, status = 400) {
    res.send({
      status,
      message: err instanceof Error ? err.message : err, // err的值可能是字符串也可能是错误对象
    });
  };

  next();
});
// 将 cors 注册为全局中间件
app.use(cors());
// 表单数据响应格式解析中间件  解析 application/x-www-form-urlencoded
app.use(express.urlencoded({ extended: false }));
// 解析json数据的中间件
app.use(express.json());

app.use(
  expressjwt({ secret: jwtKey, algorithms: ["HS256"] }).unless({
    path: ["/api/login", "/api/reguser"],
  })
);

// 注册路由模块
app.use("/api", userRouter);

// 4.1 全局错误级别中间件，捕获验证失败的错误
app.use(function (err, req, res, next) {
  // 4.1 Joi 参数校验失败
  if (err instanceof Joi.ValidationError) {
    return res.send({
      status: 400,
      message: err.message,
    });
  }
  // 身份认证失败错误
  if (err.name === "UnauthorizedError") return res.cc("身份认证失败！");

  // 4.2 未知错误
  res.cc(err);
});

// 调用 app.listen 方法，指定端口号并启动web服务器
app.listen(3007, function () {
  console.log("api server running at http://127.0.0.1:3007");
});
